// 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时，我们称其为湍流子数组：

// 若 i <= k < j，当 k 为奇数时， A[k] > A[k+1]，且当 k 为偶数时，A[k] < A[k+1]；
// 或 若 i <= k < j，当 k 为偶数时，A[k] > A[k+1] ，且当 k 为奇数时， A[k] < A[k+1]。
// 也就是说，如果比较符号在子数组中的每个相邻元素对之间翻转，则该子数组是湍流子数组。

// 返回 A 的最大湍流子数组的长度。

const maxTurbulenceSize = function (arr: number[]): number {
    // 边界情况
    if (arr.length < 2) {
        return 1;
    }
    let left = 0;// 左指针
    let right = 1;// 右指针
    let res = 1;// 结果数组
    let preIncreasing: boolean = arr[1] > arr[0];// 判断之前趋势是否递增
    while (right < arr.length) {
        const currIncreasing: boolean = arr[right] > arr[right - 1];// 判断当前趋势是否递增
        if (currIncreasing === preIncreasing) {// 如果趋势相等，需要右移左指针
            left = right - 1;
        }
        // 边界情况不要遗漏，左指针直接挪到右指针位置
        if (arr[right] === arr[right - 1]) {
            left = right;
        }
        // 更新状态变量
        res = Math.max(res, right - left + 1);
        right++;
        preIncreasing = currIncreasing;
    }
    return res;
};

maxTurbulenceSize(
    [9, 4, 2, 10, 7, 8, 8, 1, 9])


// 这道题目是一道细节需要注意比较多的题目
// 首先对于这种连续子数组的题目，应该比较容易想到可以使用滑动窗口算法来求解
// 这里首先解决第一个问题：如何判断湍流子数组？
// 实际上这里有一个比较好的方法，我们用一个变量判断当前加入的新元素是否递增
// 然后在每一轮循环中保存这个变量，用当前规则与保存的变量进行比较观察是否相等
// 如果不相等就可以判断是湍流子数组
// 如果相等说明已经有三个元素保持递增，应该把左指针移动到右指针 - 1的位置
// 但这里有一个边界情况，就是当前元素与前一个元素相等时，应该直接把左指针移动到当前元素的位置才对
// 之后我们维护当前湍流数组的长度为 right - left + 1
// 更新状态变量即可求解题目。
